﻿using Negocio.clases_tontas;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Datos;
using Negocio.catalogos;

namespace Negocio.catalogos
{
    public class catalogoAsistencia
    {
        ControlAsistenciaEntities _obj = new ControlAsistenciaEntities();
        
        /// <summary>
        /// Obtiene las asistencias general
        /// </summary>
        /// <returns></returns>
        public List<asistenciaClase> obtenerAsistencia()
        {
            List<asistenciaClase> _lista = new List<asistenciaClase>();
            try
            {
                foreach (var item in _obj.procConsultarAsistencia())
                {
                    _lista.Add(new asistenciaClase(item.idAsistencia, (DateTime)item.fechaAsistencia,  new catalogoTipoAsistencia().obtenerTipoAsistenciaXID( (int)item.idTipo).First(), new catalogoCabeceraAsistencia().obtenerCabeceraAsistenciaXIDCabeceraAsistencia((int)item.idCabeceraAsistencia)));
                }
                return _lista;
            }
            catch (Exception)
            {
                return _lista;
            }            
        }
        /// <summary>
        /// obtiene las cabeceras por idcabecera y estudiante
        /// </summary>
        /// <param name="_idCabecera">filtro</param>
        /// <param name="_idEstudiante">filtro</param>
        /// <returns></returns>
        public List<asistenciaClase> obtenerAsistenciaxIDCabeceraANDidEstudiante(int _idCabecera, int _idEstudiante)
        {
            List<asistenciaClase> _lista = new List<asistenciaClase>();
            try
            {
                foreach (var item in _obj.procConsultarAsistenciaXidCabeceraANDidEstudiante(_idCabecera, _idEstudiante))
                {
                    _lista.Add(new asistenciaClase(item.idAsistencia, (DateTime)item.fechaAsistencia, (int)item.idTipo, new catalogoCabeceraAsistencia().obtenerCabeceraAsistenciaXIDCabeceraAsistenciaLimpia((int)item.idCabeceraAsistencia)));
                }
                return _lista;
            }
            catch (Exception)
            {
                return _lista;
            }
        }
        /// <summary>
        /// obtiene las cabeceras por idcabecera y estudiante y la fecha de la asistencia
        /// </summary>
        /// <param name="_idCabecera">filtro</param>
        /// <param name="_idEstudiante">filtro</param>
        /// <param name="_fecha">filtro</param>
        /// <returns></returns>
            public List<asistenciaClase> obtenerAsistenciaxIDCabeceraANDidEstudianteANDFecha(int _idEstudiante, string _fechaInicio, string _fechaFinal)
        {
            List<asistenciaClase> _lista = new List<asistenciaClase>();
            try
            {
                foreach (var item in _obj.procConsultarAsistenciaXidCabeceraANDidEstudianteANDFecha(_idEstudiante,_fechaInicio, _fechaFinal))
                {
                    _lista.Add(new asistenciaClase(item.idAsistencia, (DateTime)item.fechaAsistencia, new catalogoTipoAsistencia().obtenerTipoAsistenciaXID((int)item.idTipo).First(), new catalogoCabeceraAsistencia().obtenerCabeceraAsistenciaXIDCabeceraAsistencia((int)item.idCabeceraAsistencia)));
                }
                return _lista;
            }
            catch (Exception)
            {
                return _lista;
            }
        }
        public List<asistenciaClase> obtenerAsistenciaxIDCabeceraANDidEstudianteANDFechaALL(int _idEstudiante, string _fechaInicio, string _fechaFinal)
        {
            List<asistenciaClase> _lista = new List<asistenciaClase>();
            try
            {
                foreach (var item in _obj.procConsultarAsistenciaXidCabeceraANDidEstudianteANDFecha(_idEstudiante, _fechaInicio, _fechaFinal))
                {
                    _lista.Add(new asistenciaClase(item.idAsistencia, (DateTime)item.fechaAsistencia, new catalogoTipoAsistencia().obtenerTipoAsistenciaXID((int)item.idTipo).First(), new catalogoCabeceraAsistencia().obtenerCabeceraAsistenciaXIDCabeceraAsistencia((int)item.idCabeceraAsistencia)));
                }
                return _lista;
            }
            catch (Exception)
            {
                return _lista;
            }
        }
        public bool ingresarAsistencia(asistenciaClase _asistencia)
        {
            try
            {
                _obj.procAgregarAsistencia(_asistencia.fecha, _asistencia.idTipo2, _asistencia.idCabeceraAsistencia);
                return true;
            }
            catch (Exception)
            {

                return false;
            }
        }
        public bool ingresarAsistencia2(DateTime _fecha, int _tipo, int _cabecera, string _observacion)
        {
            try
            {
                _obj.procAgregarAsistencia(_fecha, _tipo, _cabecera);

                return true;
            }
            catch (Exception)
            {

                return false;

            }
        }

        public bool modificarAsistencia(int _idAsistencia, int _idTipo, int _idobservacion)
        {
            try
            {
                _obj.procModificarAsistencia(_idAsistencia, _idTipo, _idobservacion);
                return true;
            }
            catch (Exception)
            {

               return false;
            }
        }
        public void modificarAsistenciaXIdAsistencia(int _idAsistencia, int _tipo, int _observacion)
        {
            try
            {
                _obj.procModificarAsistencia(_idAsistencia, _tipo, _observacion);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public int contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipo(int _idPeriodo, int _idDistribucion, int _idEstudiante, string _detalleTipo)
        {
            try
            {
                return _obj.procconsultarAsistenciaXIdDistribucionANDIdPeriodoAndIdEstudianteANDDetalleTipo(_idDistribucion, _idPeriodo, _idEstudiante, _detalleTipo).First().Value;
            }
            catch (Exception)
            {
                return 0;
            }
        }

        public int contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(int _idPeriodo, int _idDistribucion, int _idEstudiante, string _detalleTipo, DateTime _fechaBuscar)
        {
            try
            {
                return _obj.procconsultarAsistenciaXIdDistribucionANDIdPeriodoAndIdEstudianteANDDetalleTipoXMES(_idDistribucion, _idPeriodo, _idEstudiante, _detalleTipo, _fechaBuscar).First().Value;
            }
            catch (Exception)
            {
                return 0;
            }
        }

        /// <summary>
        /// obtiene las cabeceras por idDistribucion, fecha, y idestudiante
        /// </summary>
        /// <param name="_idCabecera">filtro</param>
        /// <param name="_idEstudiante">filtro</param>
        /// <returns></returns>
        public List<asistenciaClase> obtenerAsistenciaxIDDistribucionANDidEstudianteXfecha(int _idDistribucion, int _idEstudiante, DateTime _fecha)
        {
            List<asistenciaClase> _lista = new List<asistenciaClase>();
            try
            {
                foreach (var item in _obj.procConsultarAsistenciaXidDistribucionANDidEstudianteXFecha(_idDistribucion, _idEstudiante, _fecha))
                {
                    _lista.Add(new asistenciaClase(item.idAsistencia, (DateTime)item.fechaAsistencia, new catalogoTipoAsistencia().obtenerTipoAsistenciaXID((int)item.idTipo).First(), new catalogoCabeceraAsistencia().obtenerCabeceraAsistenciaXIDCabeceraAsistencia((int)item.idCabeceraAsistencia)));
                }
                return _lista;
            }
            catch (Exception)
            {
                return _lista;
            }
        }
        public List<horarioClases> consultarAsistenciasxCabeceraFechaEstudiante(int cabecera, DateTime fecha, int estudiante)
        {
            List<horarioClases> _lista = new List<horarioClases>();
            foreach (var item in _obj.procConsultarAsistenciasxCabecera(cabecera,fecha,estudiante))
            {
                _lista.Add(new horarioClases {observacion=(int)item.idTipo }); 
            }
            return _lista;
        }
        public string  TomarAsistenciasUniversidad(DateTime _fecha, int _feriado,int _tipo)
        {
            try
            {
               _obj.procAsistenciaTodaUniversidad(_fecha,_feriado,_tipo);
                return "OK";
            }
            catch (Exception)
            {

                return "ERROR";
            }
        }

    }
}
